import os.path
from mimetypes import guess_type
from minio import Minio, S3Error
from config.minio_config import endpoint, access_key, secret_key
from utils.log import logger


def store_video_minio(file_path, file_name):
    """
    存储PPT视频到minio
    :param file_path: 文件路径
    :param file_name: 文件名
    :return: minio地址
    """

    # 初始化MinIO客户端
    logger.info(f"存储PPT视频到minio服务器。")
    client = Minio(endpoint, access_key=access_key, secret_key=secret_key, secure=False)
    # 检查存储桶是否存在，如果不存在则创建
    bucket_name = "ppt-video"
    try:
        if not client.bucket_exists(bucket_name):
            client.make_bucket(bucket_name)
        logger.info(f"Bucket {bucket_name} created/exists.")
    except S3Error as err:
        logger.exception(err)

    # 尝试猜测文件类型
    content_type, _ = guess_type(file_path)
    if not content_type:
        # 如果猜测失败，手动指定音频文件的MIME类型
        content_type = 'video/mp4'  # 根据文件实际类型指定 (这里是MP4类型)

    # 上传文件
    try:
        # 无需打开文件即可上传。
        client.fput_object(bucket_name, file_name, file_path, content_type=content_type)
        logger.info(f"Video视频 {file_name} 文件上传至minio成功.")
    except S3Error as err:
        logger.exception(err)

    return f'http://{endpoint}/{bucket_name}/{file_name}'


# res = store_video_minio(r"C:\研究生\研究生所学知识技术\实验室项目\智能出题\PPT生成视频DEMO\resources\video\ppt模板命名规范.mp4","ppt模板命名规范.mp4")
# print(res)



def store_audio_minio(file_path,file_name):
    """
    存储slide对应的音频片段到minio服务器
    :param file_path: 文件的完整路径路径类似于C:\研究生\研究生所学知识技术\实验室项目\智能出题\PPT生成视频DEMO\resources\audio\电力行业PPT\电力行业PPT_1.wav
    :param file_name: 文件名
    :return: minio地址
    """

    # 初始化MinIO客户端
    client = Minio(endpoint, access_key=access_key, secret_key=secret_key, secure=False)
    # 检查存储桶是否存在，如果不存在则创建
    bucket_name = "slide-audio"
    try:
        if not client.bucket_exists(bucket_name):
            client.make_bucket(bucket_name)
        logger.info(f"Bucket {bucket_name} created/exists.")
    except S3Error as err:
        logger.exception(err)

    # 尝试猜测文件类型
    content_type, _ = guess_type(file_path)
    if not content_type:
        # 如果猜测失败，手动指定音频文件的MIME类型
        content_type = 'audio/wav'  # 根据文件实际类型指定 (这里是MP3类型)

    # 上传文件
    try:
        # 无需打开文件即可上传。
        client.fput_object(bucket_name, file_name, file_path, content_type=content_type)
        logger.info(f"audio音频 {file_name} 文件上传至minio成功.")
    except S3Error as err:
        logger.exception(err)

    return f'http://{endpoint}/{bucket_name}/{file_name}'

# file_path = r"C:\研究生\研究生所学知识技术\实验室项目\智能出题\PPT生成视频DEMO\resources\audio\电力行业PPT\电力行业PPT_1.wav"
# file_name = "电力行业PPT_1.wav"
# res = store_audio_minio(file_path, file_name)
# print(res)


def store_slide_minio(file_path, file_name, picture_count):
    """
    存储slide幻灯片页面到minio服务器
    :param picture_count: 当前待上传到minio的PPT对应的图片数量
    :param file_path: 文件的完整路径路径类似于r"C:\研究生\研究生所学知识技术\实验室项目\智能出题\PPT生成视频DEMO\resources\picture\电力行业PPT，并没具体到图片"
    :param file_name: 文件名,例如：电力行业PPT
    :return: 所有图片的minio地址以字典的形式返回
    """

    # 初始化MinIO客户端
    client = Minio(endpoint, access_key=access_key, secret_key=secret_key, secure=False)
    # 检查存储桶是否存在，如果不存在则创建
    bucket_name = "slide-picture"
    res = []
    try:
        if not client.bucket_exists(bucket_name):
            client.make_bucket(bucket_name)
        logger.info(f"Bucket {bucket_name} created/exists.")
    except S3Error as err:
        logger.exception(err)
    # 开始向minio循环存储图片
    for page_index in range(picture_count):
        # 具体的路径，例如：C:\研究生\研究生所学知识技术\实验室项目\智能出题\PPT生成视频DEMO\resources\picture\电力行业PPT\幻灯片8.JPG
        store_path = os.path.join(file_path, f"幻灯片{page_index + 1}.JPG")
        # 尝试猜测文件类型
        content_type, _ = guess_type(store_path)
        if not content_type:
            # 如果猜测失败，手动指定音频文件的MIME类型
            content_type = 'image/jpeg'  # 根据文件实际类型指定 (这里是jpg类型)

        # 上传文件
        try:
            # 无需打开文件即可上传。
            slide = f"{file_name}_{page_index + 1}"
            client.fput_object(bucket_name, slide, store_path, content_type=content_type)

            # 将信息存入到字典中
            res.append({f"{page_index + 1}": f'http://{endpoint}/{bucket_name}/{slide}'})

            logger.info(f"幻灯片页面slide {slide} 上传至minio成功.")
        except S3Error as err:
            logger.exception(err)

    return res


# file_path = r"C:\研究生\研究生所学知识技术\实验室项目\智能出题\PPT生成视频DEMO\resources\picture\电力行业PPT"
# file_name = "电力行业PPT"
# res = store_slide_minio(file_path, file_name, 3)
# print(res)